/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.model;

import com.caracol.db.AccesoDatos;
import com.caracol.db.CaracolQueryGenerator;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

/**
 * The main entity and this class represents the 
 * operations that can be realized in the database
 * and also the search options
 * 
 * @author Roquet
 */
public class Oficial {

    private static CaracolQueryGenerator caracolQuery = new CaracolQueryGenerator();

    private int id;
    private String descripcion;
    /**
     * Name of the id colum in the databaase
     */
    public static final String ID = "id";
    /**
     * Name of the oficial's name colum in the database (not null)
     */
    public static final String NOMBRE = "nombre";
    /**
     * Name of the oficial's last name colum in the database (not null)
     */
    public static final String AP_PATERNO = "apellido_paterno";
    /**
     * Name of the oficial's second last name colum in the database (not null)
     */
    public static final String AP_MATERNO = "apellido_materno";
    /**
     * Name of the oficial's birthdate colum in the database (not null)
     */
    public static final String FECHA_NACIMIENTO = "fecha_nacimiento";
    /**
     * Name of the oficial's age colum in the database (can be null)
     */
    public static final String EDAD = "edad";
    /**
     * Name of the oficial's gender in the database (not null)
     */
    public static final String SEXO = "sexo";
    /**
     * Name of the oficial's CURP (Clave Unica de Registro de Población)
     * in the database (can be null)
     */
    public static final String CURP = "curp";
    /**
     * Name of the oficial's RFC (Registro Federal de Contribuyentes)
     * in the database (can be null)
     */
    public static final String RFC = "rfc";
    /**
     * Name of the oficial's nationality
     * in the database (not null)
     */
    public static final String NACIONALIDAD = "nacionalidad";
    /**
     * Name of the oficial's street
     * in the database (not null)
     */
    public static final String CALLE = "calle";
    /**
     * Name of the oficial's number this is part of the address
     * in the database (not null)
     */
    public static final String NUMERO = "numero";
    /**
     * Name of the oficial's colonia this is part of the address
     * in the database (not null)
     */
    public static final String COLONIA = "colonia";
    /**
     * Name of the oficial's municipio this is part of the address
     * in the database (not null)
     */
    public static final String MUNICIPIO = "municipio";
    /**
     * Name of the oficial's estado civil in the database (not null)
     */
    public static final String ESTADO_CIVIL = "estado_civil";
    /**
     * Name of the oficial's phone number (home) in the database (can be null)
     */
    public static final String TELEFONO_FIJO = "telefono_fijo";
    /**
     * Name of the oficial's phone number (cellphone) in the database (can be null)
     */
    public static final String CELULAR = "telefono_movil";
    /**
     * Name of the oficial's conyugue in the database (can be null)
     */
    public static final String NOMBRE_CONYUGUE = "nombre_conyugue";
    /**
     * Name of the oficial's conyugue last name in the database (can be null)
     */
    public static final String APELLIDO_PCONYUGUE = "apellido_pconyugue";
    /**
     * Name of the oficial's conyugue second last name in the database (can be null)
     */
    public static final String APELLIDO_MCONYUGUE = "apellido_mconyugue";
    /**
     * Name of the oficial's photo name in the database (can be null)
     */
    public static final String FOTO = "foto";
    /**
     * Name of the oficial's cargo in the database (not null)
     * this is used to get the related entitys
     */
    public static final String ID_CARGO = "id_cargo";
    /**
     * Name of the oficial's grado (can be null)
     */
    public static final String GRADO = "grado";
    /**
     * Name of the oficial's turno column (can be null)
     */
    public static final String TURNO = "turno";
    /**
     * Name of the oficial's CSM (Cartilla Militar) column (not null)
     */
    public static final String CSM = "csm";
    /**
     * Name of the oficial's cuip column (can be null)
     */
    public static final String CUIP = "cuip";
    /**
     * Name of the oficial's salary column (not null)
     */
    public static final String SUELDO = "sueldo";
    /**
     * Name of the oficial's driving licence column (can be null)
     */
    public static final String ID_LICENCIA = "id_licencia";
    
    /**
     * Ingreso of the oficial in the active service
     */
    public static final String INGRESO = "ingreso";
    
    /**
     * Name of the oficial's antiguedad column (not null)
     */
    public static final String ANTIGUEDAD = "antiguedad";
    /**
     * Name of the oficial's antiguedad column (can be null)
     */
    public static final String NUM_NOMINA = "num_nomina";
    /**
     * Name of the oficial's blood type column (can be null)
     */
    public static final String TIPO_SANGRE = "tipo_sangre";
    /**
     * Name of the oficial's doping column (not null)
     */
    public static final String DOPING = "doping";
    /**
     * Name of the oficial's medic column (not null)
     */
    public static final String MEDICO = "medico_responsable";
    /**
     * Name of the oficial's fecha baja column (can be null)
     */
    public static final String FECHA_BAJA = "fecha_baja";
    /**
     * Name of the oficial's motivo de la baja column (can be null)
     */
    public static final String MOTIVO_BAJA = "motivo_baja";
    /**
     * Name of the table in the database
     */
    public static final String TABLE = "oficiales";
    
    private String nombre;
    private String apellidoPaterno;
    private String apellidoMaterno;
    private Date fechaNacimiento;
    private int edad;
    private String sexo;
    private String curp;
    private String rfc;
    private String nacionalidad;
    private String calle;
    private String numero;
    private String colonia;
    private String municipio;
    private int estadoCivil;
    private String telefonoFijo;
    private String nombreConyugue;
    private String apellidoPConyugue;
    private String apellidoMConyugue;
    private byte[] foto;
    private int idCargo;
    private String grado;
    private String turno;
    private String csm;
    private String cuip;
    private double sueldo;
    private int idLicencia;
    private Date ingreso;
    private String antiguedad;
    private String numNomina;
    private String tipoSangre;
    private String doping;
    private String medico;
    private Date fechaBaja;
    private String motivoBaja;
    private String celular;

    /**
     * Creates an instace with the default values
     */
    public Oficial() {
        this(0, "", "", "", null, 0, "", "", "", "", "", "", "", "", 1, "", "", "", "", "", 
                null, 0, "", "", "", "", 0.00, 1, null, "", "", "", "", "", null, "");
    }
    
    /**
     * Creates an instace with the not null values of this instance
     */
    public Oficial(String nombre, String apellidoPaterno,
            String apellidoMaterno, Date fechaNacimiento, int edad,
            String sexo, String nacionalidad, String calle, String numero,
            String colonia, String municipio, int estadoCivil, 
            int idCargo, String csm, String cuip, double sueldo, int idLicencia,
            Date ingreso, String antiguedad, Date fechaBaja, String motivoBaja) {
        this(0, nombre, apellidoPaterno, apellidoMaterno, fechaNacimiento, edad, 
                sexo, "", "", nacionalidad, calle, numero, colonia, municipio, 
                estadoCivil, "", "", "", "", "", null, idCargo, "", 
                "", csm, cuip, sueldo, idLicencia, ingreso, antiguedad, "", "", "", "",
                fechaBaja, motivoBaja);
    }

    /**
     * Creates a oficial instance with the given values
     * @param id Identifier of the ofical
     * @param nombre name of the oficial
     * @param apellidoPaterno lasta name of the ofical
     * @param apellidoMaterno second last name (mother) materno of the oficial
     * @param fechaNacimiento birthdate of the oficial
     * @param edad age of the oficial
     * @param sexo gender of the oficial
     * @param curp curp(Clave Unica de Registro de Poblacion) of the oficial
     * @param rfc rfc (Registro Federal del Contribuyente) of the oficial
     * @param nacionalidad nationality membership of a nation of the oficial 
     * @param calle street (address) of the ofical
     * @param numero number (address) of the oficial
     * @param colonia neighborhood (address) of the oficial
     * @param municipio municipio/province of the oficial
     * @param estadoCivil estado civil of the oficial
     * @param telefonoFijo phone number of the ofical's home
     * @param nombreConyugue name of the oficial's housband/wife
     * @param apellidoPConyugue last name of the oficial's housband/wife
     * @param apellidoMConyugue second last name of the oficial's housband/wife
     * @param foto oficial's photo this is like a stream of bytes
     * @param idCargo oficial's cargo
     * @param grado oficial's grade
     * @param turno oficial's turno
     * @param csm oficial's csm
     * @param cuip oficial's cuip
     * @param sueldo oficial's sueldo
     * @param idLicencia oficial's licence
     * @param ingreso oficial's salary
     * @param antiguedad antiguedad of the oficial
     * @param numNomina this is the number of the Nomina of this Oficial
     * @param tipoSangre oficial's blood type
     * @param doping oficial's result of the doping test
     * @param medico oficial's medic name
     * @param fechaBaja oficial's date of remove from active service
     * @param motivoBaja oficial's reason of remove from active service
     */
    private Oficial(int id, String nombre, String apellidoPaterno,
            String apellidoMaterno, Date fechaNacimiento, int edad,
            String sexo, String curp, String rfc, String nacionalidad,
            String calle, String numero, String colonia, String municipio,
            int estadoCivil, String telefonoFijo, String celular,
            String nombreConyugue, String apellidoPConyugue, 
            String apellidoMConyugue, byte[] foto, int idCargo, String grado,
            String turno, String csm, String cuip, double sueldo, int idLicencia,
            Date ingreso, String antiguedad, String numNomina, String tipoSangre,
            String doping, String medico, Date fechaBaja, String motivoBaja) {
        this.id = id;
        this.nombre = nombre;
        this.apellidoPaterno = apellidoPaterno;
        this.apellidoMaterno = apellidoMaterno;
        this.fechaNacimiento = fechaNacimiento;
        this.edad = edad;
        this.sexo = sexo;
        this.curp = curp;
        this.rfc = rfc;
        this.nacionalidad = nacionalidad;
        this.calle = calle;
        this.numero = numero;
        this.colonia = colonia;
        this.municipio = municipio;
        this.estadoCivil = estadoCivil;
        this.telefonoFijo = telefonoFijo;
        this.celular = celular;
        this.nombreConyugue = nombreConyugue;
        this.apellidoPConyugue = apellidoPConyugue;
        this.apellidoMConyugue = apellidoMConyugue;
        this.foto = foto;
        this.idCargo = idCargo;
        this.grado = grado;
        this.turno = turno;
        this.csm = csm;
        this.cuip = cuip;
        this.sueldo = sueldo;
        this.idLicencia = idLicencia;
        this.ingreso = ingreso;
        this.antiguedad = antiguedad;
        this.numNomina = numNomina;
        this.tipoSangre = tipoSangre;
        this.doping = doping;
        this.medico = medico;
        this.fechaBaja = fechaBaja;
        this.motivoBaja = motivoBaja;
    }

    /**
     * Gets a grado academico from the database by his given id
     * @param oficial's identifier
     * @return Oficial instance if its find in the dabase otherwise return null
     * @throws Exception if some exception happends this is throw again
     */
    public static Oficial getOficial(int id) throws Exception {
        StringBuilder sb = new StringBuilder("SELECT " + ID + ",");
        sb.append(NOMBRE + "," + AP_PATERNO + "," + AP_MATERNO + ",");
        sb.append(FECHA_NACIMIENTO + "," + EDAD + "," + SEXO + ",");
        sb.append(CURP + "," + RFC + "," + NACIONALIDAD + ",");
        sb.append(CALLE + "," + NUMERO + "," + COLONIA + ",");
        sb.append(MUNICIPIO + "," + ESTADO_CIVIL + "," + TELEFONO_FIJO + ",");
        sb.append(CELULAR + "," + NOMBRE_CONYUGUE + "," + APELLIDO_PCONYUGUE + ",");
        sb.append(APELLIDO_MCONYUGUE + "," + FOTO + "," + ID_CARGO + ",");
        sb.append(GRADO + "," + TURNO + "," + CSM + ",");
        sb.append(CUIP + "," + SUELDO + "," + ID_LICENCIA + ",");
        sb.append(INGRESO + "," + ANTIGUEDAD + "," + NUM_NOMINA + ",");
        sb.append(TIPO_SANGRE + "," + DOPING + "," + MEDICO + ",");
        sb.append(FECHA_BAJA + "," + MOTIVO_BAJA + " FROM ");
        sb.append(TABLE + " WHERE " + ID + " = ").append(id);
        ArrayList<Object> resultset = new ArrayList(caracolQuery.executeQuery(sb.toString()));
        if (resultset != null && resultset.size() > 0) {
            Vector<Object> row = (Vector<Object>) resultset.get(0);
            String nombre = row.elementAt(1).toString();
            String apellidoPaterno = row.elementAt(2).toString();
            String apellidoMaterno = row.elementAt(3).toString();
            Date fechaNacimiento = (Date) row.elementAt(4); // Warning!! maybe we should create the date
            int edad = Integer.parseInt(row.elementAt(5).toString());
            String sexo = row.elementAt(6).toString();
            String curp = row.elementAt(7) != null ? row.elementAt(7).toString() : "null";
            String rfc = row.elementAt(6) != null ? row.elementAt(8).toString() : "null";
            String nacionalidad = row.elementAt(9).toString();
            String calle = row.elementAt(10).toString();
            String numero = row.elementAt(11).toString();
            String colonia = row.elementAt(12).toString();
            String municipio = row.elementAt(13).toString();
            int estadoCivil = Integer.parseInt(row.elementAt(14).toString());
            String telefonoFijo = row.elementAt(15) != null ? row.elementAt(15).toString() : "null";
            String telefonoMovil = row.elementAt(16) != null ? row.elementAt(16).toString() : "null";
            String nombreConyugue = row.elementAt(17) != null ? row.elementAt(17).toString() : "null";
            String apellidoPConyugue = row.elementAt(18) != null ? row.elementAt(18).toString() : "null";
            String apellidoMConyugue = row.elementAt(19) != null ? row.elementAt(19).toString() : "null";
            byte[] foto = row.elementAt(20) != null ? (byte[]) row.elementAt(20) : null;
            int idCargo = Integer.parseInt(row.elementAt(21).toString());
            String grado = row.elementAt(22) != null ? row.elementAt(22).toString() : "null";
            String turno = row.elementAt(23) != null ? row.elementAt(23).toString() : "null" ;
            String csm = row.elementAt(24).toString();
            String cuip = row.elementAt(25) != null ? row.elementAt(25).toString() : "null";
            double sueldo = new Double(row.elementAt(26).toString());
            int idLicencia = Integer.parseInt(row.elementAt(27).toString());
            Date ingreso = (Date) row.elementAt(28);
            String antiguedad = row.elementAt(29).toString();
            String numNomina = row.elementAt(30) != null ? row.elementAt(30).toString() : "null";
            String tipoSangre = row.elementAt(31) != null ? row.elementAt(31).toString() : "null";
            String doping = row.elementAt(32).toString();
            String medico = row.elementAt(33).toString();
            Date fechaBaja = row.elementAt(34) != null ? (Date) row.elementAt(34) : null;
            String motivoBaja = row.elementAt(35) != null ? row.elementAt(35).toString() : "null";
            
            Oficial of = new Oficial(id, nombre, apellidoPaterno,
                    apellidoMaterno, fechaNacimiento, edad, sexo,
                    curp, rfc, nacionalidad, calle, numero, colonia,
                    municipio, estadoCivil, telefonoFijo, telefonoMovil,
                    nombreConyugue, apellidoPConyugue, apellidoMConyugue,
                    foto, idCargo, grado, turno, csm, cuip, sueldo,
                    idLicencia, ingreso, antiguedad, numNomina,
                    tipoSangre, doping, medico, fechaBaja, motivoBaja);
            return of;
        }
        return null;
    }

    /***
     * Save the values of this instance in the database
     * @return true if it's save or if this is already save otherwise false
     * @throws Exception if exception happends this is throw
     */
    public boolean save() throws Exception {
        if (getId() > 0) {
            return true;
        }
        
        Map<String,Object> m = new LinkedHashMap<String,Object>();
        m.put(NOMBRE, getNombre());
        m.put(AP_PATERNO, getApellidoPaterno());
        m.put(AP_MATERNO, getApellidoMaterno());
        m.put(FECHA_NACIMIENTO, getFechaNacimiento());
        m.put(EDAD, getEdad());
        m.put(SEXO, getSexo());
        m.put(CURP, getCurp());
        m.put(RFC, getRfc());
        m.put(NACIONALIDAD, getNacionalidad());
        m.put(CALLE, getCalle());
        m.put(NUMERO, getNumero());
        m.put(COLONIA, getColonia());
        m.put(MUNICIPIO, getMunicipio());
        m.put(ESTADO_CIVIL, getEstadoCivil());
        m.put(TELEFONO_FIJO, getTelefonoFijo());
        m.put(CELULAR, getCelular());
        m.put(NOMBRE_CONYUGUE, getNombreConyugue());
        m.put(APELLIDO_PCONYUGUE, getApellidoPConyugue());
        m.put(APELLIDO_MCONYUGUE, getApellidoMConyugue());
        m.put(FOTO, getFoto());
        m.put(ID_CARGO, getIdCargo());
        m.put(GRADO, getGrado());
        m.put(TURNO, getTurno());
        m.put(CSM, getCsm());
        m.put(CUIP, getCuip());
        m.put(SUELDO, getSueldo());
        m.put(ID_LICENCIA, getIdLicencia());
        m.put(INGRESO, getIngreso());
        m.put(ANTIGUEDAD, getAntiguedad());
        m.put(NUM_NOMINA, getNumNomina());
        m.put(TIPO_SANGRE, getTipoSangre());
        m.put(DOPING, getDoping());
        m.put(MEDICO, getMedico());
        m.put(FECHA_BAJA, getFechaBaja());
        m.put(MOTIVO_BAJA, getMotivoBaja());
        
        int rowsAffected = caracolQuery.insert(TABLE, m);
        
        ArrayList<Object> data = null;
        if (rowsAffected > 0) {
            AccesoDatos ad = caracolQuery.getOpenConnection();
            data = new ArrayList<Object>(ad.rawQuery("SELECT currval(\'sqoficiales\');"));
        }
        if (data != null && data.size() > 0) {
            ArrayList<Object> row = (ArrayList<Object>) data.get(0);
            Double temp = Double.parseDouble(row.get(0).toString());
            this.id = temp.intValue();
            return true;
        }
        return false;
        
    }
    
    /**
     * Get all the oficials from the database
     * @return List<Oficial> list of all oficials from the database
     * @throws Exception if some exception occurs during the operation
     */
    public static List<Oficial> getAll() throws Exception{
        List<Oficial> result = new ArrayList<Oficial>();
        String[] columns = new String[] { ID, NOMBRE, AP_PATERNO,
        AP_MATERNO, FECHA_NACIMIENTO, EDAD, SEXO, CURP,
        RFC, NACIONALIDAD, CALLE, NUMERO, COLONIA, MUNICIPIO,
        ESTADO_CIVIL, TELEFONO_FIJO, CELULAR, NOMBRE_CONYUGUE,
        APELLIDO_PCONYUGUE, APELLIDO_MCONYUGUE, FOTO, ID_CARGO,
        GRADO, TURNO, CSM, CUIP, SUELDO, ID_LICENCIA, INGRESO,
        ANTIGUEDAD, NUM_NOMINA, TIPO_SANGRE, DOPING, MEDICO,
        FECHA_BAJA, MOTIVO_BAJA };
        
        List<Object> oficiales = caracolQuery.query(columns ,TABLE, null, null, null, null, null);
        
        for(Object oficial : oficiales){
            List<Object> row = (List<Object>) oficial;
            Oficial tempOficial = new Oficial();
            tempOficial.id = Integer.parseInt(row.get(0).toString());
            tempOficial.setNombre(row.get(1).toString());
            tempOficial.setApellidoPaterno(row.get(2).toString());
            tempOficial.setApellidoMaterno(row.get(3).toString());
            tempOficial.setFechaNacimiento((Date) row.get(4));
            tempOficial.setEdad(new Double(row.get(5).toString()).intValue());
            tempOficial.setSexo(row.get(6).toString());
            tempOficial.setCurp(row.get(7).toString());
            tempOficial.setRfc(row.get(8).toString());
            tempOficial.setNacionalidad(row.get(0).toString());
            tempOficial.setCalle(row.get(10).toString());
            tempOficial.setNumero(row.get(11).toString());
            tempOficial.setColonia(row.get(12).toString());
            tempOficial.setMunicipio(row.get(13).toString());
            tempOficial.setEstadoCivil(new Double(row.get(14).toString()).intValue());
            tempOficial.setTelefonoFijo(row.get(15).toString());
            tempOficial.setCelular(row.get(16).toString());
            tempOficial.setNombreConyugue(row.get(17).toString());
            tempOficial.setApellidoPConyugue(row.get(18).toString());
            tempOficial.setApellidoMConyugue(row.get(19).toString());
            tempOficial.setFoto((byte[]) row.get(20));
            tempOficial.setIdCargo(new Double(row.get(21).toString()).intValue());
            tempOficial.setGrado(row.get(22).toString());
            tempOficial.setTurno(row.get(23).toString());
            tempOficial.setCsm(row.get(24).toString());
            tempOficial.setCuip(row.get(25).toString());
            tempOficial.setSueldo(new Double(row.get(26).toString()));
            tempOficial.setIdLicencia(new Double(row.get(27).toString()).intValue());
            tempOficial.setIngreso((Date) row.get(28));
            tempOficial.setAntiguedad(row.get(29).toString());
            tempOficial.setNumNomina(row.get(30).toString());
            tempOficial.setTipoSangre(row.get(31).toString());
            tempOficial.setDoping(row.get(32).toString());
            tempOficial.setMedico(row.get(33).toString());
            tempOficial.setFechaBaja((Date) row.get(34));
            tempOficial.setMotivoBaja(row.get(35).toString());
            result.add(tempOficial);
        }
        return result;
    }
    
    /**
     * Search by all the oficials and returns a list with the containing results
     * @param name
     * @return
     * @throws SQLException
     * @throws Exception 
     */
    public static List<Oficial> searchByName(String name) throws SQLException, Exception {
        List<Oficial> searchResult = new ArrayList<Oficial>();
        
        String[] columns = new String[] { ID, NOMBRE, AP_PATERNO,
        AP_MATERNO, FECHA_NACIMIENTO, EDAD, SEXO, CURP,
        RFC, NACIONALIDAD, CALLE, NUMERO, COLONIA, MUNICIPIO,
        ESTADO_CIVIL, TELEFONO_FIJO, CELULAR, NOMBRE_CONYUGUE,
        APELLIDO_PCONYUGUE, APELLIDO_MCONYUGUE, FOTO, ID_CARGO,
        GRADO, TURNO, CSM, CUIP, SUELDO, ID_LICENCIA, INGRESO,
        ANTIGUEDAD, NUM_NOMINA, TIPO_SANGRE, DOPING, MEDICO,
        FECHA_BAJA, MOTIVO_BAJA };
        
        Map<String,String> like = new LinkedHashMap<String,String>(3);
        like.put(NOMBRE, name);
        like.put(AP_PATERNO, name);
        like.put(AP_MATERNO, name);
        
        List<Object> oficiales = caracolQuery.likeQuery(columns ,TABLE, like, null, null, null, null);
        
        for(Object oficial : oficiales){
            List<Object> row = (List<Object>) oficial;
            Oficial tempOficial = new Oficial();
            tempOficial.id = Integer.parseInt(row.get(0).toString());
            tempOficial.setNombre(row.get(1).toString());
            tempOficial.setApellidoPaterno(row.get(2).toString());
            tempOficial.setApellidoMaterno(row.get(3).toString());
            tempOficial.setFechaNacimiento((Date) row.get(4));
            tempOficial.setEdad(new Double(row.get(5).toString()).intValue());
            tempOficial.setSexo(row.get(6).toString());
            tempOficial.setCurp(row.get(7).toString());
            tempOficial.setRfc(row.get(8).toString());
            tempOficial.setNacionalidad(row.get(0).toString());
            tempOficial.setCalle(row.get(10).toString());
            tempOficial.setNumero(row.get(11).toString());
            tempOficial.setColonia(row.get(12).toString());
            tempOficial.setMunicipio(row.get(13).toString());
            tempOficial.setEstadoCivil(new Double(row.get(14).toString()).intValue());
            tempOficial.setTelefonoFijo(row.get(15).toString());
            tempOficial.setCelular(row.get(16).toString());
            tempOficial.setNombreConyugue(row.get(17).toString());
            tempOficial.setApellidoPConyugue(row.get(18).toString());
            tempOficial.setApellidoMConyugue(row.get(19).toString());
            tempOficial.setFoto((byte[]) row.get(20));
            tempOficial.setIdCargo(new Double(row.get(21).toString()).intValue());
            tempOficial.setGrado(row.get(22).toString());
            tempOficial.setTurno(row.get(23).toString());
            tempOficial.setCsm(row.get(24).toString());
            tempOficial.setCuip(row.get(25).toString());
            tempOficial.setSueldo(new Double(row.get(26).toString()));
            tempOficial.setIdLicencia(new Double(row.get(27).toString()).intValue());
            tempOficial.setIngreso((Date) row.get(28));
            tempOficial.setAntiguedad(row.get(29).toString());
            tempOficial.setNumNomina(row.get(30).toString());
            tempOficial.setTipoSangre(row.get(31).toString());
            tempOficial.setDoping(row.get(32).toString());
            tempOficial.setMedico(row.get(33).toString());
            tempOficial.setFechaBaja((Date) row.get(34));
            tempOficial.setMotivoBaja(row.get(35).toString());
            searchResult.add(tempOficial);
        }
        return searchResult;
    }
    
    /**
     * Search by name plus last name and also mother name
     * this search is made by concat all the name and the apply a like statement
     * @param name
     * @param lastName
     * @param motherName
     * @return
     * @throws SQLException
     * @throws Exception 
     */
    public static List<Oficial> searchByNameFullName(String name, String lastName, String motherName) throws SQLException, Exception {
        List<Oficial> searchResult = new ArrayList<Oficial>();
        
        String[] columns = new String[] { ID, NOMBRE, AP_PATERNO,
        AP_MATERNO, FECHA_NACIMIENTO, EDAD, SEXO, CURP,
        RFC, NACIONALIDAD, CALLE, NUMERO, COLONIA, MUNICIPIO,
        ESTADO_CIVIL, TELEFONO_FIJO, CELULAR, NOMBRE_CONYUGUE,
        APELLIDO_PCONYUGUE, APELLIDO_MCONYUGUE, FOTO, ID_CARGO,
        GRADO, TURNO, CSM, CUIP, SUELDO, ID_LICENCIA, INGRESO,
        ANTIGUEDAD, NUM_NOMINA, TIPO_SANGRE, DOPING, MEDICO,
        FECHA_BAJA, MOTIVO_BAJA };
        
        Map<String,String> like = new LinkedHashMap<String,String>(3);
        like.put(NOMBRE + " ||\' \'|| " + AP_PATERNO + " ||\' \'|| " + AP_MATERNO, name + " " + lastName + " " + motherName);
        
        List<Object> oficiales = caracolQuery.likeQuery(columns ,TABLE, like, null, null, null, null);
        
        for(Object oficial : oficiales){
            List<Object> row = (List<Object>) oficial;
            Oficial tempOficial = new Oficial();
            tempOficial.id = Integer.parseInt(row.get(0).toString());
            tempOficial.setNombre(row.get(1).toString());
            tempOficial.setApellidoPaterno(row.get(2).toString());
            tempOficial.setApellidoMaterno(row.get(3).toString());
            tempOficial.setFechaNacimiento((Date) row.get(4));
            tempOficial.setEdad(new Double(row.get(5).toString()).intValue());
            tempOficial.setSexo(row.get(6).toString());
            tempOficial.setCurp(row.get(7).toString());
            tempOficial.setRfc(row.get(8).toString());
            tempOficial.setNacionalidad(row.get(0).toString());
            tempOficial.setCalle(row.get(10).toString());
            tempOficial.setNumero(row.get(11).toString());
            tempOficial.setColonia(row.get(12).toString());
            tempOficial.setMunicipio(row.get(13).toString());
            tempOficial.setEstadoCivil(new Double(row.get(14).toString()).intValue());
            tempOficial.setTelefonoFijo(row.get(15).toString());
            tempOficial.setCelular(row.get(16).toString());
            tempOficial.setNombreConyugue(row.get(17).toString());
            tempOficial.setApellidoPConyugue(row.get(18).toString());
            tempOficial.setApellidoMConyugue(row.get(19).toString());
            tempOficial.setFoto((byte[]) row.get(20));
            tempOficial.setIdCargo(new Double(row.get(21).toString()).intValue());
            tempOficial.setGrado(row.get(22).toString());
            tempOficial.setTurno(row.get(23).toString());
            tempOficial.setCsm(row.get(24).toString());
            tempOficial.setCuip(row.get(25).toString());
            tempOficial.setSueldo(new Double(row.get(26).toString()));
            tempOficial.setIdLicencia(new Double(row.get(27).toString()).intValue());
            tempOficial.setIngreso((Date) row.get(28));
            tempOficial.setAntiguedad(row.get(29).toString());
            tempOficial.setNumNomina(row.get(30).toString());
            tempOficial.setTipoSangre(row.get(31).toString());
            tempOficial.setDoping(row.get(32).toString());
            tempOficial.setMedico(row.get(33).toString());
            tempOficial.setFechaBaja((Date) row.get(34));
            tempOficial.setMotivoBaja(row.get(35).toString());
            searchResult.add(tempOficial);
        }
        return searchResult;
    }
    
    /**
     * Updates the record containing this id in the database
     * with this instance values
     * @return true if the operations affects more than one row
     * @throws Exception is some exception happend this is throw
     */
    public boolean update() throws Exception {
        int result = 0;
        
        Map<String, Object> values = new LinkedHashMap<String, Object>();
        values.put(NOMBRE, getNombre());
        values.put(AP_PATERNO, getApellidoPaterno());
        values.put(AP_MATERNO, getApellidoMaterno());
        values.put(FECHA_NACIMIENTO, getFechaNacimiento());
        values.put(EDAD, getEdad());
        values.put(SEXO, getSexo());
        values.put(CURP, getCurp());
        values.put(RFC, getRfc());
        values.put(NACIONALIDAD, getNacionalidad());
        values.put(CALLE, getCalle());
        values.put(NUMERO, getNumero());
        values.put(COLONIA, getColonia());
        values.put(MUNICIPIO, getMunicipio());
        values.put(ESTADO_CIVIL, getEstadoCivil());
        values.put(TELEFONO_FIJO, getTelefonoFijo());
        values.put(CELULAR, getCelular());
        values.put(NOMBRE_CONYUGUE, getNombreConyugue());
        values.put(APELLIDO_PCONYUGUE, getApellidoPConyugue());
        values.put(APELLIDO_MCONYUGUE, getApellidoMConyugue());
        values.put(FOTO, getFoto());
        values.put(ID_CARGO, getIdCargo());
        values.put(GRADO, getGrado());
        values.put(TURNO, getTurno());
        values.put(CSM, getCsm());
        values.put(CUIP, getCuip());
        values.put(SUELDO, getSueldo());
        values.put(ID_LICENCIA, getIdLicencia());
        values.put(INGRESO, getIngreso());
        values.put(ANTIGUEDAD, getAntiguedad());
        values.put(NUM_NOMINA, getNumNomina());
        values.put(TIPO_SANGRE, getTipoSangre());
        values.put(DOPING, getDoping());
        values.put(MEDICO, getMedico());
        values.put(FECHA_BAJA, getFechaBaja());
        values.put(MOTIVO_BAJA, getMotivoBaja());
        
        Map<String,Object> conditions = new LinkedHashMap<String, Object>();
        conditions.put(ID, getId());
        
        result = caracolQuery.update(TABLE, values, conditions);
        
        return result > 0;
    }


    /**
     * Deletes the given official if this is already deleted it 
     * returns true, this is evaluated checking it's id and compare if it's
     * greater than 0
     * 
     * @return true if the operation is realized with no error otherwise false
     * @throws Exception throws the exception if happend
     */
    public boolean delete() throws Exception {
        if (id <= 0) {
            return true;
        }

        Map<String, Object> conditions = new LinkedHashMap<String, Object>();
        conditions.put(ID, getId());
        int rowsAffected = caracolQuery.delete(TABLE, conditions);

        if (rowsAffected > 0) {
            id = 0;
        }

        return rowsAffected > 0;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    @Override
    public String toString() {
        return "{Nombre:" + getNombre() + " " + getApellidoPaterno() + ", CUIP:" + getCuip() + " }";
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the apellidoPaterno
     */
    public String getApellidoPaterno() {
        return apellidoPaterno;
    }

    /**
     * @param apellidoPaterno the apellidoPaterno to set
     */
    public void setApellidoPaterno(String apellidoPaterno) {
        this.apellidoPaterno = apellidoPaterno;
    }

    /**
     * @return the apellidoMaterno
     */
    public String getApellidoMaterno() {
        return apellidoMaterno;
    }

    /**
     * @param apellidoMaterno the apellidoMaterno to set
     */
    public void setApellidoMaterno(String apellidoMaterno) {
        this.apellidoMaterno = apellidoMaterno;
    }

    /**
     * @return the fechaNacimiento
     */
    public Date getFechaNacimiento() {
        return fechaNacimiento;
    }

    /**
     * @param fechaNacimiento the fechaNacimiento to set
     */
    public void setFechaNacimiento(Date fechaNacimiento) {
        this.fechaNacimiento = fechaNacimiento;
    }

    /**
     * @return the edad
     */
    public int getEdad() {
        return edad;
    }

    /**
     * @param edad the edad to set
     */
    public void setEdad(int edad) {
        this.edad = edad;
    }

    /**
     * @return the sexo
     */
    public String getSexo() {
        return sexo;
    }

    /**
     * @param sexo the sexo to set
     */
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    /**
     * @return the curp
     */
    public String getCurp() {
        return curp;
    }

    /**
     * @param curp the curp to set
     */
    public void setCurp(String curp) {
        this.curp = curp;
    }

    /**
     * @return the rfc
     */
    public String getRfc() {
        return rfc;
    }

    /**
     * @param rfc the rfc to set
     */
    public void setRfc(String rfc) {
        this.rfc = rfc;
    }

    /**
     * @return the nacionalidad
     */
    public String getNacionalidad() {
        return nacionalidad;
    }

    /**
     * @param nacionalidad the nacionalidad to set
     */
    public void setNacionalidad(String nacionalidad) {
        this.nacionalidad = nacionalidad;
    }

    /**
     * @return the calle
     */
    public String getCalle() {
        return calle;
    }

    /**
     * @param calle the calle to set
     */
    public void setCalle(String calle) {
        this.calle = calle;
    }

    /**
     * @return the numero
     */
    public String getNumero() {
        return numero;
    }

    /**
     * @param numero the numero to set
     */
    public void setNumero(String numero) {
        this.numero = numero;
    }

    /**
     * @return the colonia
     */
    public String getColonia() {
        return colonia;
    }

    /**
     * @param colonia the colonia to set
     */
    public void setColonia(String colonia) {
        this.colonia = colonia;
    }

    /**
     * @return the municipio
     */
    public String getMunicipio() {
        return municipio;
    }

    /**
     * @param municipio the municipio to set
     */
    public void setMunicipio(String municipio) {
        this.municipio = municipio;
    }

    /**
     * @return the estadoCivil
     */
    public int getEstadoCivil() {
        return estadoCivil;
    }

    /**
     * @param estadoCivil the estadoCivil to set
     */
    public void setEstadoCivil(int estadoCivil) {
        this.estadoCivil = estadoCivil;
    }

    /**
     * @return the telefonoFijo
     */
    public String getTelefonoFijo() {
        return telefonoFijo;
    }

    /**
     * @param telefonoFijo the telefonoFijo to set
     */
    public void setTelefonoFijo(String telefonoFijo) {
        this.telefonoFijo = telefonoFijo;
    }

    /**
     * @return the nombreConyugue
     */
    public String getNombreConyugue() {
        return nombreConyugue;
    }

    /**
     * @param nombreConyugue the nombreConyugue to set
     */
    public void setNombreConyugue(String nombreConyugue) {
        this.nombreConyugue = nombreConyugue;
    }

    /**
     * @return the apellidoPConyugue
     */
    public String getApellidoPConyugue() {
        return apellidoPConyugue;
    }

    /**
     * @param apellidoPConyugue the apellidoPConyugue to set
     */
    public void setApellidoPConyugue(String apellidoPConyugue) {
        this.apellidoPConyugue = apellidoPConyugue;
    }

    /**
     * @return the apellidoMConyugue
     */
    public String getApellidoMConyugue() {
        return apellidoMConyugue;
    }

    /**
     * @param apellidoMConyugue the apellidoMConyugue to set
     */
    public void setApellidoMConyugue(String apellidoMConyugue) {
        this.apellidoMConyugue = apellidoMConyugue;
    }

    /**
     * @return the foto
     */
    public byte[] getFoto() {
        return foto;
    }

    /**
     * @param foto the foto to set
     */
    public void setFoto(byte[] foto) {
        this.foto = foto;
    }

    /**
     * @return the idCargo
     */
    public int getIdCargo() {
        return idCargo;
    }

    /**
     * @param idCargo the idCargo to set
     */
    public void setIdCargo(int idCargo) {
        this.idCargo = idCargo;
    }

    /**
     * @return the grado
     */
    public String getGrado() {
        return grado;
    }

    /**
     * @param grado the grado to set
     */
    public void setGrado(String grado) {
        this.grado = grado;
    }

    /**
     * @return the turno
     */
    public String getTurno() {
        return turno;
    }

    /**
     * @param turno the turno to set
     */
    public void setTurno(String turno) {
        this.turno = turno;
    }

    /**
     * @return the csm
     */
    public String getCsm() {
        return csm;
    }

    /**
     * @param csm the csm to set
     */
    public void setCsm(String csm) {
        this.csm = csm;
    }

    /**
     * @return the cuip
     */
    public String getCuip() {
        return cuip;
    }

    /**
     * @param cuip the cuip to set
     */
    public void setCuip(String cuip) {
        this.cuip = cuip;
    }

    /**
     * @return the sueldo
     */
    public double getSueldo() {
        return sueldo;
    }

    /**
     * @param sueldo the sueldo to set
     */
    public void setSueldo(double sueldo) {
        this.sueldo = sueldo;
    }

    /**
     * @return the idLicencia
     */
    public int getIdLicencia() {
        return idLicencia;
    }

    /**
     * @param idLicencia the idLicencia to set
     */
    public void setIdLicencia(int idLicencia) {
        this.idLicencia = idLicencia;
    }

    /**
     * @return the ingreso
     */
    public Date getIngreso() {
        return ingreso;
    }

    /**
     * @param ingreso the ingreso to set
     */
    public void setIngreso(Date ingreso) {
        this.ingreso = ingreso;
    }

    /**
     * @return the antiguedad
     */
    public String getAntiguedad() {
        return antiguedad;
    }

    /**
     * @param antiguedad the antiguedad to set
     */
    public void setAntiguedad(String antiguedad) {
        this.antiguedad = antiguedad;
    }

    /**
     * @return the numNomina
     */
    public String getNumNomina() {
        return numNomina;
    }

    /**
     * @param numNomina the numNomina to set
     */
    public void setNumNomina(String numNomina) {
        this.numNomina = numNomina;
    }

    /**
     * @return the tipoSangre
     */
    public String getTipoSangre() {
        return tipoSangre;
    }

    /**
     * @param tipoSangre the tipoSangre to set
     */
    public void setTipoSangre(String tipoSangre) {
        this.tipoSangre = tipoSangre;
    }

    /**
     * @return the doping
     */
    public String getDoping() {
        return doping;
    }

    /**
     * @param doping the doping to set
     */
    public void setDoping(String doping) {
        this.doping = doping;
    }

    /**
     * @return the medico
     */
    public String getMedico() {
        return medico;
    }

    /**
     * @param medico the medico to set
     */
    public void setMedico(String medico) {
        this.medico = medico;
    }

    /**
     * @return the fechaBaja
     */
    public Date getFechaBaja() {
        return fechaBaja;
    }

    /**
     * @param fechaBaja the fechaBaja to set
     */
    public void setFechaBaja(Date fechaBaja) {
        this.fechaBaja = fechaBaja;
    }

    /**
     * @return the motivoBaja
     */
    public String getMotivoBaja() {
        return motivoBaja;
    }

    /**
     * @param motivoBaja the motivoBaja to set
     */
    public void setMotivoBaja(String motivoBaja) {
        this.motivoBaja = motivoBaja;
    }

    /**
     * @return the celular
     */
    public String getCelular() {
        return celular;
    }

    /**
     * @param celular the celular to set
     */
    public void setCelular(String celular) {
        this.celular = celular;
    }

    /** 
     * Search in the database for the given cargo in the database if the Oficial is already save by checking it's
     * id if is so uses the <code>getIdCargo()</code> method to get the cargo id and then search in the database
     * @return Cargo of this Oficial or null if can not find any Cargo Identifier
     * @throws SQLException if some database exception is throws during the execution of this operation
     * @throws Exception if something other from the database throws an exception
     */
    public Cargo getCargo() throws SQLException, Exception {
        Cargo c = null;
        c = Cargo.getCargo(getIdCargo());
        
        return c;
    }
}
